--author:wking@NGA

--[[
    flag_inout_Instance变量是进出副本标志变量
    在副本内=0
    在副本外=1
    通过几个条件判断，确定从副本外进入到副本内后，值由1变为0；从副本内进入到副本外后，值由0变为1。
]]

function ()
    --通告输出判断代码段开始
    -- AddMessage未知错误，删除代码段
    --通告输出判断代码段结束
    
    --判断等级,返回经验值阈值代码段开始
    if UnitLevel("player") == MAX_PLAYER_LEVEL_TABLE[GetExpansionLevel()] then  -- 满级不做经验值判断
        exp_threshold = -1
    elseif UnitLevel("player") < 11 then
        exp_threshold = 1000
    else
        exp_threshold = 2000
    end
    --判断等级,返回经验值阈值代码段结束
    
    --调试模式强制赋值，出副本即可公告
    if aura_env.config["isdebug"] then
        exp_threshold = -1
        if aura_env.var["total_time"] < 120 then
            aura_env.var["total_time"] = aura_env.var["total_time"] + 120
        end
    end
    
    -- 获取当前经验条声望信息代码
    local faction = {}
    aura_env.var["faction_name"],faction['standing'],faction['min'],faction['max'],faction['value'],faction['factionID'] = GetWatchedFactionInfo()  --无声望条时，faction_name=nil,其他项为0
    if aura_env.var["faction_name"] == nil then
        aura_env.var["faction_name"] = "-"
    end
    
    
    -- 计算升级、声望信息代码
    local str_exp_pct = string.format("%0.2f", (UnitXPMax("player")-UnitXP("player"))/UnitXPMax("player")*100)  -- 升级还需多少百分比的经验
    local str_exp_num = string.format("%0.1f",  (UnitXPMax("player")-UnitXP("player"))/aura_env.var["total_exp"])  -- 升级还需刷多少次副本
    local str_fct_get = faction['value'] - aura_env.var["faction_start"]  -- 当前副本获得声望数值
    local str_fct_num = string.format("%0.1f",  (faction['max'] - faction['value'])/str_fct_get) -- 声望升级还需刷多少次副本
    if str_exp_num == "-nan(ind)" or str_exp_num == "-inf" or str_exp_num == "inf" then str_exp_num = "-" end
    if str_fct_num == "-nan(ind)" or str_fct_num == "-inf" or str_fct_num == "inf" then str_fct_num = "-" end
    
    
    if ( not IsInInstance() and not UnitIsDeadOrGhost("player") ) and ( aura_env.var["total_exp"] > exp_threshold and aura_env.var["total_time"] > 120 or aura_env.var["flag_inout_Instance"] == 1 ) then --在副本外，记录初始时间经验等级
        if aura_env.var["isUILoadingFinish"] == 1 then
            if aura_env.var["flag_inout_Instance"] <1 then  --通告代码
                if aura_env.var["end_time"] == 0 then
                    aura_env.var["end_time"] = GetTime() 
                    if aura_env.config["isdebug"] then print(date("%H:%M:%S") .. " [DEBUG] aura_env.var[end_time] = " .. GetTime()) end
                end
            else
                aura_env.var["isUILoadingFinish"] = 0
            end
        end
        if aura_env.var["end_time"] ~= 0 and (GetTime() - aura_env.var["end_time"] >= 0.5) then  -- 触发EVENT，变量赋值后，延时0.05秒喊话
            aura_env.var["end_time"] = 0
            local hour,minute = GetGameTime()
            str = "("..string.format("%02u", hour)..":"..string.format("%02u", minute)..")副本次数" .. aura_env.var["num"] .. "，副本用时" .. string.format("%02u", aura_env.var["total_time_min"]) .. ":" .. string.format("%02u", aura_env.var["total_time_sec"])
            str_exp = "，杀怪数量" .. string.format("%u", aura_env.var["kill_count"]) .."，获得经验" .. string.format("%u", aura_env.var["total_exp"]) .."，当前等级" .. UnitLevel("player") .."，升级还需".. str_exp_num .."次。"
            str_fct = "获得".. str_fct_get.. "点".. aura_env.var["faction_name"].. "声望，声望升级还需" .. str_fct_num .. "次。"
            str = str .. str_exp .. str_fct .. "【ExpHelper】"
            
            if #str < 255 then  -- 如果发送字符大于系统限制255，分开发送
                if aura_env.config["isdebug"] then print(date("%H:%M:%S") .. " [DEBUG]" .. str) end
                if aura_env.config["send_exp"] == 1 then  --不通告
                    --nothing
                elseif aura_env.config["send_exp"] == 2 then  --通告队伍频道
                    if IsInGroup() then
                        SendChatMessage(str, "PARTY")
                    else
                        print("不在队伍中，无法通告")
                    end
                elseif aura_env.config["send_exp"] == 3 then  --私密自己
                    SendChatMessage(str,"WHISPER", nil, UnitName("player"))
                elseif aura_env.config["send_exp"] == 4 then  --通告仅自己可见
                    _G["ChatFrame"..aura_env.config["send_exp_chat_num"]]:AddMessage(str)
                end
            else
                if aura_env.config["isdebug"] then print(date("%H:%M:%S") .. " [DEBUG]" .. str_exp) end
                if aura_env.config["send_exp"] == 1 then  --不通告
                    --nothing
                elseif aura_env.config["send_exp"] == 2 then  --通告队伍频道
                    if IsInGroup() then
                        SendChatMessage(str_exp, "PARTY")
                    else
                        print("不在队伍中，无法通告")
                    end
                elseif aura_env.config["send_exp"] == 3 then  --私密自己
                    SendChatMessage(str_exp,"WHISPER", nil, UnitName("player"))
                elseif aura_env.config["send_exp"] == 4 then  --通告仅自己可见
                    _G["ChatFrame"..aura_env.config["send_exp_chat_num"]]:AddMessage(str_exp)
                end
                
                if aura_env.config["isdebug"] then print(date("%H:%M:%S") .. " [DEBUG]" .. str_fct) end
                if aura_env.config["send_exp"] == 1 then  --不通告
                    --nothing
                elseif aura_env.config["send_exp"] == 2 then  --通告队伍频道
                    if IsInGroup() then
                        SendChatMessage(str_fct, "PARTY")
                    else
                        print("不在队伍中，无法通告")
                    end
                elseif aura_env.config["send_exp"] == 3 then  --私密自己
                    SendChatMessage(str_fct,"WHISPER", nil, UnitName("player"))
                elseif aura_env.config["send_exp"] == 4 then  --通告仅自己可见
                    _G["ChatFrame"..aura_env.config["send_exp_chat_num"]]:AddMessage(str_fct)
                end
            end
            
            aura_env.var["flag_inout_Instance"] = 1
            aura_env.var["isUILoadingFinish"] = 0
            if aura_env.config["isdebug"] then print(date("%H:%M:%S") .. " [DEBUG] 出副本，变量重置") end
        end
        
        
    else  --在副本内
        
        aura_env.var["total_time"] = GetTime() - aura_env.var["start_time"]
        
        if aura_env.var["isUILoadingFinish"] == 1 then  -- 等待UI载入完毕
            if aura_env.var["flag_inout_Instance"] == 1 then
                local faction_temp = {GetWatchedFactionInfo()}  --获取当前经验条声望信息  faction_temp[1]=nil则没有监控声望条
                if faction_temp[1] ~= nil then -- 不需要考虑else情况，因为初始化已经赋值过了
                    aura_env.var["faction_start"] = faction_temp[5]
                end
                aura_env.var["isUILoadingFinish"] = 0
                aura_env.var["flag_inout_Instance"] = 0
                aura_env.var["start_time"] = GetTime()
                aura_env.var["start_exp"] = UnitXP("player")  --目前等级已获得经验
                aura_env.var["start_levelexpmax"] = UnitXPMax("player")  --记录开始等级所需最大经验
                aura_env.var["start_level"] = UnitLevel("player")
                aura_env.var["kill_count"] = 0  --在这里重置杀怪数，以便副本外不重置可以看到上一次副本杀了几个怪
                aura_env.var["num"] = aura_env.var["num"] + 1
                if aura_env.config["isdebug"] then print(date("%H:%M:%S") .. " [DEBUG] 进入副本，变量重置") end
            end
        end
        
        
        if UnitLevel("player") == aura_env.var["start_level"] then
            aura_env.var["total_exp"] = UnitXP("player") - aura_env.var["start_exp"]
        else --如果升级了
            aura_env.var["total_exp"] = UnitXP("player") + aura_env.var["start_levelexpmax"] - aura_env.var["start_exp"]
        end
    end
    
    if aura_env.var["total_time"] ~= 0 then  --修复副本外载入脚本，由于total_time=0导致计算每秒效率会出错的BUG
        aura_env.var["exp_per_time"] = aura_env.var["total_exp"] / aura_env.var["total_time"]
    else
        aura_env.var["exp_per_time"] = 0
    end
    
    aura_env.var["total_time_min"] = aura_env.var["total_time"] / 60
    aura_env.var["total_time_sec"] = aura_env.var["total_time"] % 60
    
    return_str = "\n副本次数: " .. aura_env.var["num"]
    return_str = return_str .. "\n副本用时: " .. string.format("%02u", aura_env.var["total_time_min"]) .. ":" .. string.format("%02u", aura_env.var["total_time_sec"])
    return_str = return_str .. "\n杀怪数量: " .. string.format("%u", aura_env.var["kill_count"])
    return_str = return_str .. "\n获得经验: " .. string.format("%u", aura_env.var["total_exp"])
    return_str = return_str .. "\n每秒效率: "..string.format("%u", aura_env.var["exp_per_time"])
    return_str = return_str .. "\n升级还需: " .. str_exp_pct .. "% ".. str_exp_num .."次"
    return_str = return_str .. "\n获得声望: " .. str_fct_get .. " ".. str_fct_num .."次"
    
    --debug
    if aura_env.config["isdebug"] then
        if ( not IsInInstance() and not UnitIsDeadOrGhost("player") ) and ( aura_env.var["total_exp"] > exp_threshold and aura_env.var["total_time"] > 120 or aura_env.var["flag_inout_Instance"] == 1 ) then
            return_str = return_str .. "\n\n在副本外" 
        else
            return_str = return_str .. "\n\n在副本内"
        end
        if aura_env.config["send_exp"] == 1 then  --不通告
            return_str = return_str .. "\n不通告"
        elseif aura_env.config["send_exp"] == 2 then  --通告队伍频道
            if IsInGroup() then
                return_str = return_str .. "\n队伍通告，在队伍中"
            else
                return_str = return_str .. "\n队伍通告，不在队伍"
            end
        elseif aura_env.config["send_exp"] == 3 then  --私密自己
            return_str = return_str .. "\n通告私密自己"
        elseif aura_env.config["send_exp"] == 4 then  --通告仅自己可见
            return_str = return_str .. "\n通告仅自己可见"
        end
        
        if str == nil then
            return_str = return_str .. "\n发送消息长度(最大255字节):" .. "-"
        else
            return_str = return_str .. "\n发送消息长度(最大255字节):" .. #str
        end
        
        return_str = return_str .. "\nstr_exp_pct[" .. type(str_exp_pct) .. "] = " .. str_exp_pct
        return_str = return_str .. "\nstr_exp_num[" .. type(str_exp_num) .. "] = " .. str_exp_num
        return_str = return_str .. "\nstr_fct_get[" .. type(str_fct_get) .. "] = " .. str_fct_get
        return_str = return_str .. "\nstr_fct_num[" .. type(str_fct_num) .. "] = " .. str_fct_num
        
        -- 显示内容格式化
        for k,v in pairs(aura_env.var) do
            if type(v) == "number" then
                return_str = return_str .. "\n" .. k .. "=" .. string.format("%2.2f", v)
            elseif type(v) == "string" then
                return_str = return_str .. "\n" .. k .. "=" .. v
            end
        end
    end
    
    return return_str
end